package com.cccyy.financial_calculations;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class VolatilityCalculator {

    /**
     * 计算波动率的方法
     * 波动率在这里是指价格序列的收益率的标准差，用于衡量价格波动的程度
     *
     * @param prices 价格列表，假设是一个时间序列的价格数据
     * @return 返回价格序列的波动率（标准差）
     * @throws IllegalArgumentException 如果价格列表为空或包含的价格少于两个，则抛出此异常
     */
    public static double calculateVolatility(List<Double> prices) {
        // 检查输入的价格列表是否有效
        if (prices == null || prices.size() < 2) {
            throw new IllegalArgumentException("Price list must contain at least two prices.");
        }

        // 计算每日收益率并存储在列表中
        List<Double> returns = new ArrayList<>();
        for (int i = 1; i < prices.size(); i++) {
            // 计算每日收益率的公式
            double dailyReturn = (prices.get(i) - prices.get(i - 1)) / prices.get(i - 1);
            returns.add(dailyReturn);
        }

        // 调用计算标准差的方法来计算波动率
        return calculateStandardDeviation(returns);
    }

    // 计算标准差的方法
    // 该方法接收一个Double类型的列表作为输入，返回该列表中数据的标准差
    private static double calculateStandardDeviation(List<Double> data) {
        // 初始化总和变量
        double sum = 0.0;
        // 初始化平均值变量
        double mean;
        // 初始化标准差变量
        double standardDeviation = 0.0;

        // 获取数据列表的长度
        int length = data.size();

        // 计算数据的总和
        for (double num : data) {
            sum += num;
        }

        // 计算数据的平均值
        mean = sum / length;

        // 计算标准差的中间结果
        for (double num : data) {
            standardDeviation += Math.pow(num - mean, 2);
        }

        // 返回标准差
        return Math.sqrt(standardDeviation / length);
    }

    /**
     * 主程序入口
     * 模拟计算一组股票价格的波动率
     * 该示例使用了一组预定义的股票价格，实际应用中，这些数据可能来自数据库或API
     */
    public static void main(String[] args) {
        // 初始化一组股票价格数据
        List<Double> prices = Arrays.asList(100.0, 102.0, 101.0, 105.0, 107.0);
        // 调用计算波动率的方法并打印结果
        double volatility = calculateVolatility(prices);
        System.out.println("Volatility: " + volatility);
    }
}
